package qc.module.platform.api.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import qc.common.core.exception.QCPromptException;
import qc.common.core.pair.KeyValuePairDto;
import qc.common.core.utils.StringSplitUtil;
import qc.module.platform.dto.enumdto.EnumDto;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

/**
 * 用于操作枚举类的Controller,用于获取1个或多个枚举类型的KV集合；
 * 默认枚举类统一都在qc.common.core.enums包下
 */
@RestController
@RequestMapping("/enum")
public class EnumController {
    
    //枚举类默认位置
    private static final String ENUM_PACKGE =  "qc.common.core.enums.";

    /**
     * 获取枚举定义集合方法
     * 获取一个或者多个枚举类型的KV集合，id传入枚举类名，使用英文下的逗号分隔。
     * 
     * @param id 枚举类名字符串，英文逗号分隔
     * @return List<Map<String,List<KeyValuePairDto>>>
     * @throws QCPromptException
     * @author Qucheng Tech
     * @since 2024/04/18
     */
    @GetMapping("/getenumoptions")
    public List<EnumDto> getEnumOptionsByEnumName(String id) throws QCPromptException {
        if (StringUtils.isBlank(id)) throw new QCPromptException("枚举名称id不能为空");

        List<EnumDto> result = new ArrayList<>();
        
        //根据枚举类名获取枚举类对象
        String[] enumNames = StringSplitUtil.Split(id,true);
        for (String enumName : enumNames){
            //枚举类全类名
            String enumClassName = ENUM_PACKGE + enumName;
            
            EnumDto enumDto = new EnumDto();
            List<KeyValuePairDto> options = new ArrayList<>();
            try {
                // 使用Class.forName()获取Class对象
                Class<?> enumClass = Class.forName(enumClassName);
                // 确保这是一个枚举类型
                if (enumClass.isEnum()) {
                    Class<Enum> ecs = (Class<Enum>) enumClass;
                    // 获取所有枚举常量
                    Object[] enumConstants = enumClass.getEnumConstants();
                    // 遍历所有常量
                    for (Object constant : enumConstants) {
                        //constant是枚举的每个元素，toString的结果是英文名称，如果重写了枚举类中的toString方法得到的是重写后的
                        //System.out.println("constant=" + constant.toString());
                        //获取枚举类的name
                        Field nameField = constant.getClass().getDeclaredField("name");
                        nameField.setAccessible(true);
                        //获取枚举类的index
                        Field indexField = constant.getClass().getDeclaredField("index");
                        indexField.setAccessible(true);
                        //获取枚举类的颜色，（EHS风险等级枚举中有颜色属性）
                        //判断color属性是否存在
                        boolean colorisExist = false;
                        Field colorField = null;
                        try {
                            colorField = constant.getClass().getDeclaredField("color");
                            colorField.setAccessible(true);
                            colorisExist = true;
                        }catch (NoSuchFieldException e){
                            //color属性不存在
                            colorisExist = false;
                        }
                        
                        if (nameField != null && indexField != null) {
                            KeyValuePairDto pair = new KeyValuePairDto();
                            pair.setKey(indexField.get(constant).toString());
                            pair.setValue(nameField.get(constant).toString());
                            if (colorisExist){
                                JSONObject jsonObject = new JSONObject();
                                jsonObject.put("color",colorField.get(constant).toString());
                                pair.setAttribute(jsonObject.toString());
                            }

                            options.add(pair);
                        }
                    }
                    
                } else {
                    throw new IllegalArgumentException(enumClassName + " is not an enum class");
                }
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            enumDto.setEnumName(enumName);
            enumDto.setOptions(options);
            result.add(enumDto);
        }
        
        return result;
    }
}
